﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AgileSaude.Entities;
using AgileSaude.Data;
using AgileSaude.Data.Repository;
using FBS.Framework;
using AgileSaude.Business.Validation;

namespace AgileSaude.Business.Process
{
    internal class MedicoProcess
    {
        internal Resultado Incluir(MedicoEntities pObj)
        {
            Resultado resultado = new Resultado();

            try
            {
                MedicoValidation userValid = new MedicoValidation(pObj);
                resultado = userValid.ValidarMedico();

                if (resultado.Sucesso)
                {
                    medico obj = new medico();
                    Util.CopyPropertyValues(pObj, obj);

                    new medicoRepository().Add(obj);
                }
            }
            catch (Exception ex)
            {
                String mensagem = ex.Message;
                new ResultadoProcess().GravarLog(ref resultado, mensagem, "AgileSaude", "", "Incluir", "MedicoProcess");
                resultado.Sucesso = false;
                throw ex;
            }

            return resultado;
        }

        internal Resultado Alterar(MedicoEntities pObj)
        {
            Resultado resultado = new Resultado();
            medicoRepository MedicoRepository = new medicoRepository();

            try
            {
                medico user = MedicoRepository.getmedico(pObj.idMedico);
                Util.CopyPropertyValues(pObj, user);

                MedicoRepository.Update();
                resultado.Sucesso = true;
            }
            catch (Exception ex)
            {
                Util.GravarLog(ex.Message, "AgileSaude");
                resultado.Sucesso = false;
                throw ex;
            }

            return resultado;
        }

        internal Resultado Deletar(MedicoEntities pObj)
        {
            Resultado resultado = new Resultado();
            medicoRepository MedicoRepository = new medicoRepository();

            try
            {
                medico obj = MedicoRepository.getmedico(pObj.idMedico);
                Util.CopyPropertyValues(pObj, obj);

                MedicoRepository.Delete(obj);
                resultado.Sucesso = true;
            }
            catch (Exception ex)
            {
                Util.GravarLog(ex.Message, "AgileSaude");
                resultado.Sucesso = false;
                throw ex;
            }

            return resultado;
        }

        internal MedicoEntities GetMedico(int pIdMedico)
        {
            medico oData = new medicoRepository().getmedico(pIdMedico);

            if (oData == null)
            {
                return new MedicoEntities();
            }
            else
            {
                return GetMedico(oData);
            }

        }

        internal MedicoEntities GetMedico(string pNome)
        {
            medico oData = new medicoRepository().getmedico(pNome);

            if (oData != null)
            {
                return GetMedico(oData);
            }
            else
            {
                return null;
            }

        }

        private static MedicoEntities GetMedico(medico oData)
        {
            MedicoEntities oEntitie = new MedicoEntities();

            Util.CopyPropertyValues(oData, oEntitie);

            try
            {
                oEntitie.CidadeNome = new CidadeFacade().GetCidade(oEntitie.idCidade).Nome;
            }
            catch { }

            try
            {

                var serv = (from u in new servico_medicoRepository().GetAll()
                                    join s in new servicoRepository().GetAll() on u.idServico equals s.idServico
                                    where s.idTipoServico == 1 && u.idMedico == oData.idMedico
                                    orderby u.DataInicio descending
                                    select u).FirstOrDefault();
                oEntitie.ValorConsulta = serv.PrecoVenda;
                oEntitie.ValorCustoConsulta = serv.PrecoCusto;
            }
            catch { }

            try
            {
                if (oEntitie.idEspecialidade.HasValue)
                    oEntitie.EspecialidadeDescr = new EspecialidadeFacade().GetEspecialidade(oEntitie.idEspecialidade.Value).Descricao;
            }
            catch { }

            return oEntitie;
        }

        internal List<MedicoEntities> Listar(MedicoEntities pFiltro, ref Resultado resultado)
        {
            List<MedicoEntities> lista = new List<MedicoEntities>();

            if (pFiltro == null)
            {
                pFiltro = new MedicoEntities();
            }

            try
            {
                var Medico = from u in new medicoRepository().GetAll()
                             where (string.IsNullOrEmpty(pFiltro.Nome) || u.Nome.ToUpper().Contains(pFiltro.Nome.ToUpper())) &&
                              (pFiltro.idMedico == 0 || u.idMedico == pFiltro.idMedico) &&
                               (pFiltro.idEspecialidade == null || u.idEspecialidade == pFiltro.idEspecialidade) &&
                               (pFiltro.idCidade == 0 || u.idCidade == pFiltro.idCidade)
                              select u;

                foreach (medico user in Medico)
                {
                    lista.Add(GetMedico(user));
                }

                resultado.Sucesso = true;
            }
            catch (Exception ex)
            {
                String mensagem = ex.Message;
                new ResultadoProcess().GravarLog(ref resultado, mensagem, "AgileSaude", "", "Listar", "MedicoProcess");
                resultado.Sucesso = false;
            }

            return lista;
        }

        internal List<MedicoEntities> Listar(bool pClinica, MedicoEntities pFiltro, ref Resultado resultado)
        {
            List<MedicoEntities> lista = new List<MedicoEntities>();

            if (pFiltro == null)
            {
                pFiltro = new MedicoEntities();
            }

            try
            {
                var Medico = from u in new medicoRepository().GetAll()
                             where u.Clinica == pClinica && (string.IsNullOrEmpty(pFiltro.Nome) || u.Nome.ToUpper().Contains(pFiltro.Nome.ToUpper())) &&
                              (pFiltro.idMedico == 0 || u.idMedico == pFiltro.idMedico) &&
                              (pFiltro.idEspecialidade == null || u.idEspecialidade == pFiltro.idEspecialidade) &&
                              (pFiltro.idCidade == 0 || u.idCidade == pFiltro.idCidade)
                             select u;

                foreach (medico user in Medico)
                {
                    lista.Add(GetMedico(user));
                }

                resultado.Sucesso = true;
            }
            catch (Exception ex)
            {
                String mensagem = ex.Message;
                new ResultadoProcess().GravarLog(ref resultado, mensagem, "AgileSaude", "", "Listar", "MedicoProcess");
                resultado.Sucesso = false;
            }

            return lista;
        }

        internal List<MedicoEntities> Listar(bool pClinica, ref Resultado resultado)
        {
            List<MedicoEntities> lista = new List<MedicoEntities>();

            try
            {
                var Medico = from u in new medicoRepository().GetAll()
                             where u.Clinica == pClinica
                             select u;

                foreach (medico user in Medico)
                {
                    lista.Add(GetMedico(user));
                }

                resultado.Sucesso = true;
            }
            catch (Exception ex)
            {
                String mensagem = ex.Message;
                new ResultadoProcess().GravarLog(ref resultado, mensagem, "AgileSaude", "", "Listar", "MedicoProcess");
                resultado.Sucesso = false;
            }

            return lista;
        }

        internal List<MedicoEntities> ListarPorTipo(int pTipoServico, int pCidade, ref Resultado resultado)
        {
            List<MedicoEntities> lista = new List<MedicoEntities>();

            try
            {
                var Medico = (from m in new medicoRepository().GetAll()
                             join sm in new servico_medicoRepository().GetAll() on m.idMedico equals sm.idMedico
                             join s in new servicoRepository().GetAll() on sm.idServico equals s.idServico
                             where s.idTipoServico == pTipoServico && m.idCidade == pCidade
                             select m).Distinct();

                foreach (medico user in Medico)
                {
                    lista.Add(GetMedico(user));
                }

                resultado.Sucesso = true;
            }
            catch (Exception ex)
            {
                String mensagem = ex.Message;
                new ResultadoProcess().GravarLog(ref resultado, mensagem, "AgileSaude", "", "Listar", "MedicoProcess");
                resultado.Sucesso = false;
            }

            return lista;
        }

        internal Resultado AtivarInativar(int pIdMedico, bool pStatus)
        {
            Resultado resultado = new Resultado();
            String mensagem = String.Empty;

            try
            {
                medicoRepository rep = new medicoRepository();

                var Medico = rep.getmedico(pIdMedico);

                Medico.Ativo = pStatus;
                rep.Update();

                mensagem = "Médico " + (pStatus ? "ativado" : "inativado") + " com sucesso.";

                Mensagem omensagem = new Mensagem();
                omensagem.Descricoes.Add(mensagem);

                resultado.Sucesso = false;
                resultado.Mensagens.Add(omensagem);

                resultado.Sucesso = true;
            }
            catch (Exception ex)
            {
                mensagem = ex.Message;
                new ResultadoProcess().GravarLog(ref resultado, mensagem, "AgileSaude", "Status", "AtivarInativar", "MedicoProcess");
                resultado.Sucesso = false;

            }

            return resultado;

        }
    }
}
